package main

import (
	"errors"
	"fmt"
)

// 让我们想象一个工厂类，这个工厂类需要生产电线和开关等器具，
// 我们可以为工厂类提供一个生产方法，当电线机器调用生产方法时，
// 就产出电线，当开关机器调用生产方法时，就产出开关。

type Pay interface {
	Pay(string) int
}

type PayReq struct {
	OrderId string
}

type APayReq struct {
	PayReq
}

func (p *APayReq) Pay() string {
	fmt.Println(p.OrderId)
	return "APay支付成功"
}

type BPayReq struct {
	PayReq
	Uid int64
}

func (p *BPayReq) Pay() string {
	fmt.Println(p.OrderId)
	fmt.Println(p.Uid)
	return "BPay支付成功"
}

// 使用
func ExamplePay() error {
	aPay := APayReq{}
	if aPay.Pay() != "APay支付成功" {
		return errors.New("APay支付失败")
	}

	bPay := BPayReq{}
	if bPay.Pay() != "BPay支付成功" {
		return errors.New("BPay支付失败")
	}
	return nil
}
